package top.zhangjianyong.tools.indicator.score;

import java.math.BigDecimal;

/**
 * 技术指标评分类型枚举
 * 定义每个指标的类型、权重和评分规则
 *
 * @author zhangjianyong
 * @date 2024/01/01
 */
public enum IndicatorScoreType {

    /**
     * MACD指标评分（权重20%）
     */
    MACD("MACD", new BigDecimal("0.20")),

    /**
     * KDJ指标评分（权重15%）
     */
    KDJ("KDJ", new BigDecimal("0.15")),

    /**
     * 布林带指标评分（权重15%）
     */
    BOLL("BOLL", new BigDecimal("0.15")),

    /**
     * RSI指标评分（权重15%）
     */
    RSI("RSI", new BigDecimal("0.15")),

    /**
     * 均线系统评分（权重20%）
     */
    MOVING_AVERAGE("SMA", new BigDecimal("0.20")),

    /**
     * 成交量评分（权重10%）
     */
    VOLUME("VOLUME", new BigDecimal("0.10")),

    /**
     * 其他技术指标评分（权重5%，包含ADX和OBV）
     */
    OTHER("OTHER", new BigDecimal("0.05"));

    /**
     * 指标名称
     */
    private final String indicatorName;

    /**
     * 权重（0-1之间的小数）
     */
    private final BigDecimal weight;

    IndicatorScoreType(String indicatorName, BigDecimal weight) {
        this.indicatorName = indicatorName;
        this.weight = weight;
    }

    public String getIndicatorName() {
        return indicatorName;
    }

    public BigDecimal getWeight() {
        return weight;
    }

    /**
     * 验证所有权重之和是否为1.0
     *
     * @return true表示权重之和为1.0
     */
    public static boolean validateWeights() {
        BigDecimal total = BigDecimal.ZERO;
        for (IndicatorScoreType type : values()) {
            total = total.add(type.getWeight());
        }
        return total.compareTo(BigDecimal.ONE) == 0;
    }
}

